package com.jackspace.main;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;

import com.jackspace.bean.Request;
import com.jackspace.bean.Response;
import com.jackspace.service.ServletProcessor;
import com.jackspace.service.StaticResourceProcessor;

public class HttpServer {

	public static final String WEB_ROOT = System.getProperty("user.dir") + File.separator + "webroot";
	
	private static final String SHUTDOWN_COMMAND = "/shutdown";
	
	private boolean shutdown = false;
	
	public static void main(String[] args) 
	{
		
		HttpServer server = new HttpServer();
		server.await();

	}
	
	public void await()
	{
		ServerSocket serverSocket = null;
		int port = 8080;
		
		try {
			serverSocket = new ServerSocket(port, 1, InetAddress.getByName("127.0.0.1"));
			
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			System.exit(1);
		}
		
		while (!shutdown)
		{
			Socket socket = null;
			InputStream input = null;
			OutputStream output = null;
			try {
				socket = serverSocket.accept();
				input = socket.getInputStream();
				output = socket.getOutputStream();
				
				Request request = new Request(input);
				request.parse();
				Response response = new Response(output);
				response.setRequest(request);
				//response.sendStaticResource();
				
				if (request.getUri().startsWith("/servlet/"))
				{
					ServletProcessor servletProcessor = new ServletProcessor();
					servletProcessor.process(request, response);
				}
				else
				{
					StaticResourceProcessor staticProcessor = new StaticResourceProcessor();
					staticProcessor.process(request, response);
				}
				
				shutdown = SHUTDOWN_COMMAND.equals(request.getUri());
				
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			finally
			{
				if (null != socket)
				{
					try {
						socket.close();
					} catch (IOException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
				
				/*if (null != input)
				{
					try {
						input.close();
					} catch (IOException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
				
				if (null != output)
				{
					try {
						output.close();
					} catch (IOException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}*/
			}
		}
	}

}
